function status = hs_signfunc(dir_path, varargin)
% hs_signfunc 在指定目录下生成函数签名文件
%
%     程序会遍历目录下的所有MATLAB函数文件和类文件（对于类文件夹只会搜索到一级子目录），为符合注释规范的
% 文件生成函数签名，程序日志(.log)也会一并保存到dir_path目录下。程序运行成功返回 0。
%
% Syntax:
%   status = hs_signfunc(dir_path ...
%                     [, "Verbose", true ...
%                      , "ArgSym", '-' ...
%                      , "OptSym", '*' ...
%                      , "Version", "1.0.0" ...
%                      , "DefaultKind", 'required' ...
%                      , "DefaultType", {"numeric"}]);
%
% Params:
%   - dir_path      [required]  [[char], [string]]   指定目录路径
%   - Verbose       [namevalue] [char; choices]      是否输出详细信息，默认为'on'
%                   * 'on'  输出过程信息
%                   * 'off' 关闭过程信息
%   - ArgSym        [namevalue] [[char], [string]]   参数标识符，默认为'-'(不建议修改)
%   - OptSym        [namevalue] [[char], [string]]   选项标识符，默认为'*'(不建议修改)
%   - Version       [namevalue] [[char], [string]]   json版本号，默认为'1.0.0'(不建议修改)
%   - DefaultKind   [namevalue] [[char], [string]]   设置默认参数类型，默认为'required'(不建议修改)
%   - DefaultType   [namevalue] [cell]               设置默认数据格式，默认为{'numeric'}(不建议修改)
%
% Return:
%   - status 返回0运行成功, 非0可能存在某些错误或警告，请查看日志.
%
% Matlab Version: 
%   R2021b or latter
% 
% See also:
%   https://ww2.mathworks.cn/help/matlab/matlab_prog/customize-code-suggestions-and-completions.html
%   https://ww2.mathworks.cn/help/matlab/matlab_prog/customize-code-suggestions-and-completions.html
%   https://ww2.mathworks.cn/help/matlab/ref/arguments.html   
%   https://gitee.com/iam002/funcsign.git
%
% Author: iam002
%
% Copyright (c) 2023

    arguments
        dir_path (1,:) char
    end
    arguments(Repeating)
        varargin
    end
    
    % 输入解析器, 设置两个可选参数
    p = inputParser;
    % 是否输出过程信息, 默认值为 false
    addParameter(p, 'Verbose', true, @islogical);
    % 参数标识符, 默认值为 '-'
    addParameter(p, 'ArgSym', '-', @(x)(ischar(x) | isstring(x)));
    % 选项标识符, 默认值为 '*'
    addParameter(p, 'OptSym', '*', @(x)(ischar(x) | isstring(x)));
    % 版本字符串, 默认值为 '1.0.0'
    addParameter(p, 'Version', '1.0.0', @(x)(ischar(x) | isstring(x)));
    % 参数默认kind, 默认值为 'required'
    addParameter(p, 'DefaultKind', 'required', @(x)(ischar(x) | isstring(x)));
    % 参数默认kind, 默认值为 {'numeric'}
    addParameter(p, 'DefaultType', {"numeric"}, @(x)(iscell(x)));
    parse(p, varargin{:});
    
    verbose = p.Results.Verbose;
    arg_sym = p.Results.ArgSym; 
    opt_sym = p.Results.OptSym;
    version = p.Results.Version;
    default_kind = p.Results.DefaultKind;
    default_type = p.Results.DefaultType;

    dir_path = string(dir_path);
    if verbose == true 
        verbose_str = 'on';
    else
        verbose_str = 'off';    
    end
    arg_sym = string(arg_sym);
    opt_sym = string(opt_sym);
    version = string(version);
    default_kind = string(default_kind);
    for i = 1:numel(default_type)
        default_type{i} = string(default_type{i});
    end
    
    sys_type_str = computer; % 获取系统名
    if isequal(sys_type_str, 'PCWIN64')
        exe_name = "signfunc.exe";
    elseif isequal(sys_type_str, 'GLNXA64')
        exe_name = "signfunc";
        if isequal(opt_sym, '*') % FIXME linux系统中会将 * 解释会当前目录所有文件
            opt_sym = '\*';
        end
    else
        error("cannot support system: %s\n", sys_type_str);
    end
    ord_list = [exe_name, dir_path ...
            , "-ag", arg_sym, "-op", opt_sym ...
            , "-ver", version, "-log", verbose_str ...
            , "-kind", default_kind, "-type", default_type{:}];
    ord_str = join(ord_list, ' ');

    status = system(ord_str);

    validateFunctionSignaturesJSON(fullfile(dir_path, 'functionSignatures.json'));
end